<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>VectSharp: VectSharp.Canvas/SKMultiLayerRenderCanvas.cs Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="Doxy.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectlogo"><img alt="Logo" src="icon.svg"/></td>
  <td id="projectalign">
   <div id="projectname">VectSharp<span id="projectnumber">&#160;2.6.1</span>
   </div>
   <div id="projectbrief">A light library for C# vector graphics</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_s_k_multi_layer_render_canvas_8cs_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>

<div class="header">
  <div class="headertitle"><div class="title">SKMultiLayerRenderCanvas.cs</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/*</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment">    VectSharp - A light library for C# vector graphics.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment">    Copyright (C) 2020-2023 Giorgio Bianchini, University of Bristol</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"></span> </div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment">    This program is free software: you can redistribute it and/or modify</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment">    it under the terms of the GNU Lesser General Public License as published by</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment">    the Free Software Foundation, version 3.</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"></span> </div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment">    This program is distributed in the hope that it will be useful,</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment">    but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment">    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment">    GNU Lesser General Public License for more details.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"></span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment">    You should have received a copy of the GNU Lesser General Public License</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment">    along with this program. If not, see &lt;https://www.gnu.org/licenses/&gt;.</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment">*/</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="keyword">using </span>Avalonia;</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="keyword">using </span>Avalonia.Media;</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span><span class="keyword">using </span>Avalonia.Media.Imaging;</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="keyword">using </span>Avalonia.Skia;</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="keyword">using </span>SkiaSharp;</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="keyword">using </span>System;</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="keyword">using </span>System.Collections.Generic;</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="keyword">using </span>System.Linq;</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="keyword">using </span>System.Threading;</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespace_vect_sharp_1_1_canvas.html">VectSharp.Canvas</a></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span>{</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span>    <span class="keyword">internal</span> <span class="keyword">interface </span>ISKRenderCanvas</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span>    {</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span>        <span class="keywordtype">void</span> InvalidateDirty();</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span>        <span class="keywordtype">void</span> InvalidateZIndex();</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span>    }</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment"></span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="comment">    /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span><span class="comment">    /// Represents a multi-threaded, triple-buffered canvas on which the image is drawn using SkiaSharp.</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="comment">    /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html">   39</a></span><span class="comment"></span>    <span class="keyword">public</span> <span class="keyword">class </span><a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html">SKMultiLayerRenderCanvas</a> : Avalonia.Controls.Control, IDisposable, ISKRenderCanvas</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>    {<span class="comment"></span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment">        /// The width of the page that is rendered on this canvas.</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4fd73dc712c4f90ed8e00412eb50bdd2">   44</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">double</span> <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4fd73dc712c4f90ed8e00412eb50bdd2">PageWidth</a> { <span class="keyword">get</span>; <span class="keyword">set</span>; }</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"></span> </div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment">        /// The height of the page that is rendered on this canvas.</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aabe2d24ee767ba8e7bac57f98d88a0ef">   49</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">double</span> <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aabe2d24ee767ba8e7bac57f98d88a0ef">PageHeight</a> { <span class="keyword">get</span>; <span class="keyword">set</span>; }</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>        <span class="keyword">private</span> SKColor BackgroundColour;</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"></span> </div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment">        /// Defines an overdraw margin for the clipping area. Set this to a larger value if quickly moving the</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment">        /// canvas around (e.g. in a ZoomBorder) causes the edge of the image to disappear for a few milliseconds</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment">        /// and that annoys you. If &lt;see cref=&quot;RelativePoint.Unit&quot;/&gt; is set to &lt;see cref=&quot;RelativeUnit.Absolute&quot;/&gt;,</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment">        /// the value corresponds to units on the &lt;see cref=&quot;VectSharp.Page&quot;/&gt;; if it is set to &lt;see cref=&quot;RelativeUnit.Relative&quot;/&gt;,</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment">        /// it corresponds to a proportion of the visible area.</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">   59</a></span><span class="comment"></span>        <span class="keyword">public</span> RelativePoint <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a> { <span class="keyword">get</span>; <span class="keyword">set</span>; } = <span class="keyword">new</span> RelativePoint(0, 0, RelativeUnit.Absolute);</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"></span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment">        /// The list of render actions. Each element in this list is itself a list, containing the actions that correspond to a layer in the image.</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aab220bda90e3a0c36f27b87bfbeff6f0">   64</a></span><span class="comment"></span>        <span class="keyword">public</span> List&lt;List&lt;SKRenderAction&gt;&gt; <a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aab220bda90e3a0c36f27b87bfbeff6f0">RenderActions</a>;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="comment"></span> </div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="comment">        /// The list of transforms associated with each layer.</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aa8cabc258828463f73b9d90612d9abee">   69</a></span><span class="comment"></span>        <span class="keyword">public</span> List&lt;SKRenderAction&gt; <a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aa8cabc258828463f73b9d90612d9abee">LayerTransforms</a>;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span> </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span>        <span class="keyword">private</span> Dictionary&lt;string, (SKBitmap, bool)&gt; Images;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span>        <span class="keyword">private</span> List&lt;List&lt;SKRenderAction&gt;&gt; TaggedRenderActions;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment"></span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment">        /// Create a new SKMultiLayerRenderCanvas from a &lt;see cref=&quot;Document&quot;/&gt;, where each page represents a layer.</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment">        /// &lt;param name=&quot;document&quot;&gt;The document containing the layers as &lt;see cref=&quot;Page&quot;/&gt;s.&lt;/param&gt;</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="comment">        /// &lt;param name=&quot;layerTransforms&quot;&gt;A list of transforms associated with each layer. This list should contain the same number of elements as the number of pages in &lt;paramref name=&quot;document&quot;/&gt;. This is useful to manipulate the position of each layer individually. If this is null, an identity transform is applied to each layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment">        /// &lt;param name=&quot;backgroundColour&quot;&gt;The background colour of the canvas.&lt;/param&gt;</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment">        /// &lt;param name=&quot;width&quot;&gt;The width of the canvas and the pages it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment">        /// &lt;param name=&quot;height&quot;&gt;The height of the canvas and the pages it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a00243775be8cd6bb94efc35791b26c71">   82</a></span><span class="comment"></span>        <span class="keyword">public</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a00243775be8cd6bb94efc35791b26c71">SKMultiLayerRenderCanvas</a>(<a class="code hl_class" href="class_vect_sharp_1_1_document.html">Document</a> document, <a class="code hl_struct" href="struct_vect_sharp_1_1_colour.html">Colour</a> backgroundColour, <span class="keywordtype">double</span> width, <span class="keywordtype">double</span> height, List&lt;SKRenderAction&gt; layerTransforms = <span class="keyword">null</span>) : this(document.Pages, backgroundColour, width, height, layerTransforms) { }</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment"></span> </div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment">        /// Create a new SKMultiLayerRenderCanvas from a collection of &lt;see cref=&quot;Page&quot;/&gt;s, each representing a layer.</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment">        /// &lt;param name=&quot;layers&quot;&gt;The contents of the canvas. Each element in this list represents a layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment">        /// &lt;param name=&quot;layerTransforms&quot;&gt;A list of transforms associated with each layer. This list should contain the same number of elements as &lt;paramref name=&quot;layers&quot;/&gt;. This is useful to manipulate the position of each layer individually. If this is null, an identity transform is applied to each layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment">        /// &lt;param name=&quot;backgroundColour&quot;&gt;The background colour of the canvas.&lt;/param&gt;</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment">        /// &lt;param name=&quot;width&quot;&gt;The width of the canvas and the pages it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment">        /// &lt;param name=&quot;height&quot;&gt;The height of the canvas and the pages it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a9a5fb8009c0eacdcfea4667f2dd21f1e">   92</a></span><span class="comment"></span>        <span class="keyword">public</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a9a5fb8009c0eacdcfea4667f2dd21f1e">SKMultiLayerRenderCanvas</a>(IEnumerable&lt;Page&gt; layers, <a class="code hl_struct" href="struct_vect_sharp_1_1_colour.html">Colour</a> backgroundColour, <span class="keywordtype">double</span> width, <span class="keywordtype">double</span> height, List&lt;SKRenderAction&gt; layerTransforms = <span class="keyword">null</span>)</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>        {</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span>            List&lt;SKRenderContext&gt; contents = (from el in layers select el.CopyToSKRenderContext()).ToList();</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span>            List&lt;SKRenderAction&gt; contentTransforms;</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span> </div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>            <span class="keywordflow">if</span> (layerTransforms == <span class="keyword">null</span>)</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>            {</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span>                contentTransforms = (from el in Enumerable.Range(0, contents.Count) select <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">SKRenderAction</a>.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html#a81405205be792374ef65bdf89cab3a4c">TransformAction</a>(SKMatrix.Identity)).ToList();</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>            }</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>            <span class="keywordflow">else</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>            {</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>                contentTransforms = layerTransforms;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span>            }</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span> </div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span>            <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a84c5f8dc4c4351723414e55fa01eafe7">UpdateWith</a>(contents, contentTransforms, backgroundColour, width, height);</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span> </div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>            this.Width = width;</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span>            this.Height = height;</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span> </div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span>            this.PointerPressed += this.PointerPressedAction;</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>            this.PointerReleased += this.PointerReleasedAction;</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>            this.PointerMoved += this.PointerMoveAction;</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>            this.PointerExited += this.PointerLeaveAction;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>        }</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span><span class="comment"></span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment">        /// Create a new SKMultiLayerRenderCanvas from a list of SKRenderContexts, each representing a layer.</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment">        /// &lt;param name=&quot;contents&quot;&gt;The contents of the canvas. Each element in this list represents a layer. A Page can be converded to a SKRenderContext through the CopyToSKRenderContext method.&lt;/param&gt;</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment">        /// &lt;param name=&quot;contentTransforms&quot;&gt;A list of transforms associated with each layer. This list should contain the same number of elements as &lt;paramref name=&quot;contents&quot;/&gt;. This is useful to manipulate the position of each layer individually.&lt;/param&gt;</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment">        /// &lt;param name=&quot;backgroundColour&quot;&gt;The background colour of the canvas.&lt;/param&gt;</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment">        /// &lt;param name=&quot;width&quot;&gt;The width of the canvas and the page it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment">        /// &lt;param name=&quot;height&quot;&gt;The height of the canvas and the page it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a777e28bd741c4a2f18f223f7cc628bbf">  125</a></span><span class="comment"></span>        <span class="keyword">public</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a777e28bd741c4a2f18f223f7cc628bbf">SKMultiLayerRenderCanvas</a>(List&lt;SKRenderContext&gt; contents, List&lt;SKRenderAction&gt; contentTransforms, <a class="code hl_struct" href="struct_vect_sharp_1_1_colour.html">Colour</a> backgroundColour, <span class="keywordtype">double</span> width, <span class="keywordtype">double</span> height)</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span>        {</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>            <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a84c5f8dc4c4351723414e55fa01eafe7">UpdateWith</a>(contents, contentTransforms, backgroundColour, width, height);</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span> </div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span>            this.Width = width;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span>            this.Height = height;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span> </div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span>            this.PointerPressed += this.PointerPressedAction;</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span>            this.PointerReleased += this.PointerReleasedAction;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span>            this.PointerMoved += this.PointerMoveAction;</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>            this.PointerExited += this.PointerLeaveAction;</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>        }</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment"></span> </div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment">        /// Replace the contents of the SKMultiLayerRenderCanvas with the specified layers.</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment">        /// &lt;param name=&quot;contents&quot;&gt;The contents of the canvas. Each element in this list represents a layer. A Page can be converded to a SKRenderContext through the CopyToSKRenderContext method.&lt;/param&gt;</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment">        /// &lt;param name=&quot;contentTransforms&quot;&gt;A list of transforms associated with each layer. This list should contain the same number of elements as &lt;paramref name=&quot;contents&quot;/&gt;. This is useful to manipulate the position of each layer individually.&lt;/param&gt;</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment">        /// &lt;param name=&quot;backgroundColour&quot;&gt;The background colour of the canvas.&lt;/param&gt;</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment">        /// &lt;param name=&quot;width&quot;&gt;The width of the canvas and the page it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment">        /// &lt;param name=&quot;height&quot;&gt;The height of the canvas and the page it contains.&lt;/param&gt;</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a84c5f8dc4c4351723414e55fa01eafe7">  146</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a84c5f8dc4c4351723414e55fa01eafe7">UpdateWith</a>(List&lt;SKRenderContext&gt; contents, List&lt;SKRenderAction&gt; contentTransforms, <a class="code hl_struct" href="struct_vect_sharp_1_1_colour.html">Colour</a> backgroundColour, <span class="keywordtype">double</span> width, <span class="keywordtype">double</span> height)</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>        {</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>            {</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span>                <span class="keywordflow">if</span> (this.RenderActions == <span class="keyword">null</span>)</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span>                {</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span>                    this.RenderActions = <span class="keyword">new</span> List&lt;List&lt;SKRenderAction&gt;&gt;();</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span>                }</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span>                <span class="keywordflow">else</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span>                {</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>                    this.RenderActions.Clear();</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span>                }</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span> </div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>                <span class="keywordflow">if</span> (this.LayerTransforms == <span class="keyword">null</span>)</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span>                {</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>                    this.LayerTransforms = <span class="keyword">new</span> List&lt;SKRenderAction&gt;();</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span>                }</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span>                <span class="keywordflow">else</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span>                {</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span>                    this.LayerTransforms.Clear();</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span>                }</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span> </div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span>                this.PageWidth = width;</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>                this.PageHeight = height;</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span>                this.BackgroundColour = backgroundColour.ToSKColor();</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span> </div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>                <span class="keywordflow">if</span> (this.Images == <span class="keyword">null</span>)</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span>                {</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span>                    Images = <span class="keyword">new</span> Dictionary&lt;string, (SKBitmap, bool)&gt;();</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>                }</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>                <span class="keywordflow">else</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>                {</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span>                    Images.Clear();</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>                }</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span> </div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; contents.Count; i++)</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span>                {</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span>                    this.LayerTransforms.Add(contentTransforms[i]);</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>                    this.RenderActions.Add(contents[i].SKRenderActions);</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span> </div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>                    <span class="keywordflow">foreach</span> (KeyValuePair&lt;<span class="keywordtype">string</span>, (SKBitmap, <span class="keywordtype">bool</span>)&gt; kvp in contents[i].Images)</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>                    {</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>                        this.Images[kvp.Key] = kvp.Value;</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>                    }</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>                }</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span> </div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>                <span class="keywordflow">if</span> (this.TaggedRenderActions == <span class="keyword">null</span>)</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>                {</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span>                    this.TaggedRenderActions = <span class="keyword">new</span> List&lt;List&lt;SKRenderAction&gt;&gt;();</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>                }</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span>                <span class="keywordflow">else</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>                {</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>                    this.TaggedRenderActions.Clear();</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>                }</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span> </div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span> </div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = this.RenderActions.Count - 1; i &gt;= 0; i--)</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span>                {</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>                    TaggedRenderActions.Add(<span class="keyword">new</span> List&lt;SKRenderAction&gt;());</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span> </div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>                    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = this.RenderActions[i].Count - 1; j &gt;= 0; j--)</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>                    {</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span>                        <a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aab220bda90e3a0c36f27b87bfbeff6f0">RenderActions</a>[i][j].InternalParent = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>                        <span class="keywordflow">if</span> (!<span class="keywordtype">string</span>.IsNullOrEmpty(this.RenderActions[i][j].Tag))</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>                        {</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>                            TaggedRenderActions[this.RenderActions.Count - 1 - i].Add(this.RenderActions[i][j]);</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>                        }</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>                    }</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span>                }</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span>            }</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>        }</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span><span class="comment"></span> </div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span><span class="comment">        /// Replace a single layer with the specified content.</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span><span class="comment">        /// &lt;param name=&quot;layer&quot;&gt;The index of the layer to replace.&lt;/param&gt;</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment">        /// &lt;param name=&quot;newContent&quot;&gt;The new contents of the layer. A Page can be converded to a SKRenderContext through the CopyToSKRenderContext method.&lt;/param&gt;</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span><span class="comment">        /// &lt;param name=&quot;newTransform&quot;&gt;The new transform for the layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a2afc05715ff7c9e4cb273943d70939ed">  224</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a2afc05715ff7c9e4cb273943d70939ed">UpdateLayer</a>(<span class="keywordtype">int</span> layer, <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_context.html">SKRenderContext</a> newContent, <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">SKRenderAction</a> newTransform)</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span>        {</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>            {</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>                this.LayerTransforms[layer] = newTransform;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>                this.RenderActions[layer] = newContent.SKRenderActions;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span> </div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>                <span class="keywordflow">foreach</span> (KeyValuePair&lt;<span class="keywordtype">string</span>, (SKBitmap, <span class="keywordtype">bool</span>)&gt; kvp in newContent.Images)</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>                {</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>                    this.Images[kvp.Key] = kvp.Value;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>                }</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span> </div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span>                TaggedRenderActions[this.RenderActions.Count - 1 - layer].Clear();</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span> </div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = this.RenderActions[layer].Count - 1; j &gt;= 0; j--)</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>                {</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>                    <a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aab220bda90e3a0c36f27b87bfbeff6f0">RenderActions</a>[layer][j].InternalParent = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>                    <span class="keywordflow">if</span> (!<span class="keywordtype">string</span>.IsNullOrEmpty(this.RenderActions[layer][j].Tag))</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>                    {</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>                        TaggedRenderActions[this.RenderActions.Count - 1 - layer].Add(this.RenderActions[layer][j]);</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span>                    }</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>                }</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>            }</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span> </div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span>            this.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>();</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span>        }</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment"></span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span><span class="comment">        /// Add a new layer to the image.</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span><span class="comment">        /// &lt;param name=&quot;newContent&quot;&gt;The contents of the new layer. A Page can be converded to a SKRenderContext through the CopyToSKRenderContext method.&lt;/param&gt;</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span><span class="comment">        /// &lt;param name=&quot;newTransform&quot;&gt;The transform for the new layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a8bc4e8c89dcb02f5beaa0a18c4c94bb5">  256</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a8bc4e8c89dcb02f5beaa0a18c4c94bb5">AddLayer</a>(<a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_context.html">SKRenderContext</a> newContent, <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">SKRenderAction</a> newTransform)</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>        {</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span>            {</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span>                this.LayerTransforms.Add(newTransform);</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span>                this.RenderActions.Add(newContent.SKRenderActions);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span> </div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>                <span class="keywordflow">foreach</span> (KeyValuePair&lt;<span class="keywordtype">string</span>, (SKBitmap, <span class="keywordtype">bool</span>)&gt; kvp in newContent.Images)</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span>                {</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span>                    this.Images[kvp.Key] = kvp.Value;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>                }</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span> </div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>                TaggedRenderActions.Insert(0, <span class="keyword">new</span> List&lt;SKRenderAction&gt;());</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span> </div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = this.RenderActions[this.RenderActions.Count - 1].Count - 1; j &gt;= 0; j--)</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span>                {</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span>                    <a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aab220bda90e3a0c36f27b87bfbeff6f0">RenderActions</a>[this.RenderActions.Count - 1][j].InternalParent = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span>                    <span class="keywordflow">if</span> (!<span class="keywordtype">string</span>.IsNullOrEmpty(this.RenderActions[this.RenderActions.Count - 1][j].Tag))</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span>                    {</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span>                        TaggedRenderActions[0].Add(this.RenderActions[this.RenderActions.Count - 1][j]);</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span>                    }</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span>                }</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span>            }</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span> </div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span>            this.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>();</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span>        }</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span><span class="comment"></span> </div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment">        /// Insert a new layer at the specified index.</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span><span class="comment">        /// &lt;param name=&quot;index&quot;&gt;The position at which the new layer will be inserted.&lt;/param&gt;</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span><span class="comment">        /// &lt;param name=&quot;newContent&quot;&gt;The contents of the new layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span><span class="comment">        /// &lt;param name=&quot;newTransform&quot;&gt;The transform for the new layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a6aaf18105ecb0af2b80c52f576d224d9">  289</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a6aaf18105ecb0af2b80c52f576d224d9">InsertLayer</a>(<span class="keywordtype">int</span> index, <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_context.html">SKRenderContext</a> newContent, <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">SKRenderAction</a> newTransform)</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>        {</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>            {</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span>                this.LayerTransforms.Insert(index, newTransform);</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>                this.RenderActions.Insert(index, newContent.SKRenderActions);</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span> </div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>                <span class="keywordflow">foreach</span> (KeyValuePair&lt;<span class="keywordtype">string</span>, (SKBitmap, <span class="keywordtype">bool</span>)&gt; kvp in newContent.Images)</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>                {</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>                    this.Images[kvp.Key] = kvp.Value;</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>                }</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span> </div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>                TaggedRenderActions.Insert(this.RenderActions.Count - 1 - index, <span class="keyword">new</span> List&lt;SKRenderAction&gt;());</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span> </div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = this.RenderActions[index].Count - 1; j &gt;= 0; j--)</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>                {</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>                    <a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aab220bda90e3a0c36f27b87bfbeff6f0">RenderActions</a>[index][j].InternalParent = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>                    <span class="keywordflow">if</span> (!<span class="keywordtype">string</span>.IsNullOrEmpty(this.RenderActions[index][j].Tag))</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>                    {</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>                        TaggedRenderActions[this.RenderActions.Count - 1 - index].Add(this.RenderActions[index][j]);</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>                    }</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>                }</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>            }</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span> </div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span>            this.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>();</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span>        }</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span><span class="comment"></span> </div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span><span class="comment">        /// Remove the specified layer from the image.</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span><span class="comment">        /// &lt;param name=&quot;layer&quot;&gt;The index of the layer to remove.&lt;/param&gt;</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a474ef13fd5ff3c54f679836ffd45af95">  320</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a474ef13fd5ff3c54f679836ffd45af95">RemoveLayer</a>(<span class="keywordtype">int</span> layer)</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>        {</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>            {</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>                this.LayerTransforms[layer].Dispose();</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>                this.LayerTransforms.RemoveAt(layer);</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; this.RenderActions[layer].Count; i++)</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span>                {</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>                    this.RenderActions[layer][i].Dispose();</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>                }</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>                this.RenderActions.RemoveAt(layer);</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span> </div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>                TaggedRenderActions.RemoveAt(this.TaggedRenderActions.Count - 1 - layer);</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span>            }</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span> </div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>            this.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>();</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>        }</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span><span class="comment"></span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span><span class="comment">        /// Switch the position of the two specified layers.</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span><span class="comment">        /// &lt;param name=&quot;layer1&quot;&gt;The index of the first layer to switch.&lt;/param&gt;</span></div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span><span class="comment">        /// &lt;param name=&quot;layer2&quot;&gt;The index of the second layer to switch.&lt;/param&gt;</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ad13a708bdb0b9a7d533f78b8eb931260">  344</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ad13a708bdb0b9a7d533f78b8eb931260">SwitchLayers</a>(<span class="keywordtype">int</span> layer1, <span class="keywordtype">int</span> layer2)</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>        {</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span>            {</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span>                var temp = this.LayerTransforms[layer1];</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span>                this.LayerTransforms[layer1] = this.LayerTransforms[layer2];</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span>                this.LayerTransforms[layer2] = temp;</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span> </div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span>                var temp2 = this.RenderActions[layer1];</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>                this.RenderActions[layer1] = this.RenderActions[layer2];</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span>                this.RenderActions[layer2] = temp2;</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span> </div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>                var temp3 = this.TaggedRenderActions[this.RenderActions.Count - 1 - layer1];</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>                this.TaggedRenderActions[this.RenderActions.Count - 1 - layer1] = this.TaggedRenderActions[this.RenderActions.Count - 1 - layer2];</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span>                this.TaggedRenderActions[this.RenderActions.Count - 1 - layer2] = temp3;</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>            }</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span> </div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span>            this.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>();</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>        }</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span><span class="comment"></span> </div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span><span class="comment">        /// Move the specified layer to the specified position, shifting all other layers as necessary.</span></div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span><span class="comment">        /// &lt;param name=&quot;oldIndex&quot;&gt;The current index of the layer to move.&lt;/param&gt;</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span><span class="comment">        /// &lt;param name=&quot;newIndex&quot;&gt;The final index of the layer. Layers after this will be shifted by 1 in order to accommodate the moved layer.&lt;/param&gt;</span></div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a65033e30e6cb9cf268c71f7a9949770e">  369</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a65033e30e6cb9cf268c71f7a9949770e">MoveLayer</a>(<span class="keywordtype">int</span> oldIndex, <span class="keywordtype">int</span> newIndex)</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>        {</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>            {</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>                var temp = this.LayerTransforms[oldIndex];</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>                this.LayerTransforms.RemoveAt(oldIndex);</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span>                this.LayerTransforms.Insert(newIndex, temp);</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span> </div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span>                var temp2 = this.RenderActions[oldIndex];</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span>                this.RenderActions.RemoveAt(oldIndex);</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span>                this.RenderActions.Insert(newIndex, temp2);</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span> </div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>                var temp3 = this.TaggedRenderActions[this.RenderActions.Count - 1 - oldIndex];</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>                this.TaggedRenderActions.RemoveAt(this.RenderActions.Count - 1 - oldIndex);</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>                this.TaggedRenderActions.Insert(this.RenderActions.Count - 1 - newIndex, temp3);</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>            }</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span> </div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>            this.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>();</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>        }</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span> </div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span> </div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>        <span class="keyword">private</span> <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">SKRenderAction</a> CurrentPressedAction = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> PointerPressedAction(<span class="keywordtype">object</span> sender, Avalonia.Input.PointerPressedEventArgs e)</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span>        {</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span>            SKPoint position = e.GetPosition(<span class="keyword">this</span>).ToSKPoint();</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span> </div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; TaggedRenderActions.Count; i++)</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>            {</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span>                <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span> </div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; TaggedRenderActions[i].Count; j++)</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span>                {</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span>                    <span class="keywordflow">if</span> (TaggedRenderActions[i][j].LastRenderedGlobalHitTestPath?.Contains(position.X, position.Y) == <span class="keyword">true</span>)</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span>                    {</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span> </div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span>                        <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">SKRenderAction</a>.<a class="code hl_enumeration" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html#afeb0838c89e91c66e8e6a35c846be3b4">ActionTypes</a>.Path)</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>                        {</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span>                            CurrentPressedAction = TaggedRenderActions[i][j];</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span>                            TaggedRenderActions[i][j].FirePointerPressed(e);</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span>                            found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span>                            <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span>                        }</div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.Text)</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span>                        {</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span>                            CurrentPressedAction = TaggedRenderActions[i][j];</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span>                            TaggedRenderActions[i][j].FirePointerPressed(e);</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>                            found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span>                            <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span>                        }</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.RasterImage)</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>                        {</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>                            CurrentPressedAction = TaggedRenderActions[i][j];</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span>                            TaggedRenderActions[i][j].FirePointerPressed(e);</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span>                            found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span>                            <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span>                        }</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>                    }</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>                }</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span> </div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>                <span class="keywordflow">if</span> (found)</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span>                {</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span>                    <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span>                }</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span>            }</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span>        }</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span> </div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> PointerReleasedAction(<span class="keywordtype">object</span> sender, Avalonia.Input.PointerReleasedEventArgs e)</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span>        {</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span>            <span class="keywordflow">if</span> (CurrentPressedAction != <span class="keyword">null</span>)</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span>            {</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span>                <span class="keywordflow">if</span> (!CurrentPressedAction.<a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html#aa88ade8626d0abce8ded370480430f4f">Disposed</a>)</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span>                {</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span>                    CurrentPressedAction.FirePointerReleased(e);</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span>                }</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span>                CurrentPressedAction = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>            }</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>            <span class="keywordflow">else</span></div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span>            {</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>                SKPoint position = e.GetPosition(<span class="keyword">this</span>).ToSKPoint();</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span> </div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; TaggedRenderActions.Count; i++)</div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>                {</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span>                    <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span> </div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span>                    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; TaggedRenderActions[i].Count; j++)</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span>                    {</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span>                        <span class="keywordflow">if</span> (TaggedRenderActions[i][j].LastRenderedGlobalHitTestPath?.Contains(position.X, position.Y) == <span class="keyword">true</span>)</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span>                        {</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span>                            <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.Path)</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span>                            {</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span>                                TaggedRenderActions[i][j].FirePointerReleased(e);</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>                                found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>                                <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span>                            }</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span>                            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.Text)</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>                            {</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span>                                TaggedRenderActions[i][j].FirePointerReleased(e);</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>                                found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span>                                <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span>                            }</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>                            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.RasterImage)</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>                            {</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span>                                TaggedRenderActions[i][j].FirePointerReleased(e);</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span>                                found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span>                                <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span>                            }</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span>                        }</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span>                    }</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span> </div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span>                    <span class="keywordflow">if</span> (found)</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span>                    {</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span>                        <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span>                    }</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span>                }</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span>            }</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span>        }</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span> </div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span>        <span class="keyword">private</span> SKRenderAction CurrentOverAction = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> PointerMoveAction(<span class="keywordtype">object</span> sender, Avalonia.Input.PointerEventArgs e)</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span>        {</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>            SKPoint position = e.GetPosition(<span class="keyword">this</span>).ToSKPoint();</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span> </div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span>            <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span> </div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span>            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; TaggedRenderActions.Count; i++)</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span>            {</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; TaggedRenderActions[i].Count; j++)</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span>                {</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span>                    <span class="keywordflow">if</span> (TaggedRenderActions[i][j].LastRenderedGlobalHitTestPath?.Contains(position.X, position.Y) == <span class="keyword">true</span>)</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span>                    {</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span>                        <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.Path)</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span>                        {</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span>                            found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span> </div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span>                            <span class="keywordflow">if</span> (CurrentOverAction != TaggedRenderActions[i][j])</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span>                            {</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span>                                <span class="keywordflow">if</span> (CurrentOverAction != <span class="keyword">null</span> &amp;&amp; !CurrentOverAction.Disposed)</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span>                                {</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span>                                    CurrentOverAction.FirePointerExited(e);</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span>                                }</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span>                                CurrentOverAction = TaggedRenderActions[i][j];</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>                                CurrentOverAction.FirePointerEntered(e);</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span>                            }</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span> </div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>                            <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span>                        }</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.Text)</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span>                        {</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span>                            found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span> </div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span>                            <span class="keywordflow">if</span> (CurrentOverAction != TaggedRenderActions[i][j])</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span>                            {</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span>                                <span class="keywordflow">if</span> (CurrentOverAction != <span class="keyword">null</span> &amp;&amp; !CurrentOverAction.Disposed)</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span>                                {</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span>                                    CurrentOverAction.FirePointerExited(e);</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span>                                }</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span>                                CurrentOverAction = TaggedRenderActions[i][j];</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span>                                CurrentOverAction.FirePointerEntered(e);</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span>                            }</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span> </div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span>                            <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span>                        }</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TaggedRenderActions[i][j].ActionType == SKRenderAction.ActionTypes.RasterImage)</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span>                        {</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span>                            found = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span> </div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span>                            <span class="keywordflow">if</span> (CurrentOverAction != TaggedRenderActions[i][j])</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span>                            {</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span>                                <span class="keywordflow">if</span> (CurrentOverAction != <span class="keyword">null</span> &amp;&amp; !CurrentOverAction.Disposed)</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span>                                {</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span>                                    CurrentOverAction.FirePointerExited(e);</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span>                                }</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span>                                CurrentOverAction = TaggedRenderActions[i][j];</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span>                                CurrentOverAction.FirePointerEntered(e);</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span>                            }</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span> </div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span>                            <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span>                        }</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span>                    }</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span>                }</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span> </div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span>                <span class="keywordflow">if</span> (found)</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span>                {</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span>                    <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span>                }</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span>            }</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span> </div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span>            <span class="keywordflow">if</span> (!found)</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span>            {</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span>                <span class="keywordflow">if</span> (CurrentOverAction != <span class="keyword">null</span> &amp;&amp; !CurrentOverAction.Disposed)</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span>                {</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>                    CurrentOverAction.FirePointerExited(e);</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span>                }</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span>                CurrentOverAction = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span>            }</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span>        }</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span> </div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> PointerLeaveAction(<span class="keywordtype">object</span> sender, Avalonia.Input.PointerEventArgs e)</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span>        {</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span>            <span class="keywordflow">if</span> (CurrentOverAction != <span class="keyword">null</span> &amp;&amp; !CurrentOverAction.Disposed)</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span>            {</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span>                CurrentOverAction.FirePointerExited(e);</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span>            }</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span>            CurrentOverAction = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span>        }</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span><span class="comment"></span> </div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span><span class="comment">        /// &lt;inheritdoc/&gt;</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span><span class="comment"></span>        <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span>        {</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span>            base.OnAttachedToVisualTree(e);</div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span> </div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span>            StartRenderingThread();</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span>        }</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno">  582</span><span class="comment"></span> </div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span><span class="comment">        /// &lt;inheritdoc/&gt;</span></div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span><span class="comment"></span>        <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span>        {</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span>            StopRenderingThread();</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span>        }</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span> </div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> StopRenderingThread()</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span>        {</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span>            DisposedHandle.Set();</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span>        }</div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span> </div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span>        <span class="keyword">private</span> EventWaitHandle DisposedHandle;</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span>        <span class="keyword">private</span> EventWaitHandle RenderRequestedHandle;</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span> </div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span>        <span class="keyword">private</span> RenderingParameters RenderingRequest = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span>        <span class="keyword">private</span> readonly <span class="keywordtype">object</span> RenderingRequestLock = <span class="keyword">new</span> object();</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span> </div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> StartRenderingThread()</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span>        {</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span>            DisposedHandle = <span class="keyword">new</span> EventWaitHandle(<span class="keyword">false</span>, EventResetMode.ManualReset);</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span>            RenderRequestedHandle = <span class="keyword">new</span> EventWaitHandle(<span class="keyword">false</span>, EventResetMode.ManualReset);</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span> </div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span>            Thread renderingThread = <span class="keyword">new</span> Thread(async () =&gt;</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span>            {</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span>                <span class="keywordtype">bool</span> finished = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span>                WaitHandle[] handles = <span class="keyword">new</span> WaitHandle[] { DisposedHandle, RenderRequestedHandle };</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span> </div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span>                <span class="keywordflow">while</span> (!finished)</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno">  611</span>                {</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span>                    <span class="keywordtype">int</span> handle = EventWaitHandle.WaitAny(handles);</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span> </div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span>                    <span class="keywordflow">if</span> (handle == 0)</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span>                    {</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span>                        finished = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span>                    }</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span>                    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (handle == 1)</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno">  619</span>                    {</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span>                        RenderingParameters requestParams;</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span> </div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span>                        lock (RenderingRequestLock)</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span>                        {</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span>                            requestParams = RenderingRequest.Clone();</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span>                            RenderRequestedHandle.Reset();</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span>                        }</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span> </div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span>                        SKCanvas canvas;</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno">  629</span> </div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span>                        <span class="keywordflow">if</span> (BackBuffer == <span class="keyword">null</span> || BackBufferRenderingParams == <span class="keyword">null</span> || requestParams.RenderWidth &gt; BackBufferRenderingParams.RenderWidth || requestParams.RenderHeight &gt; BackBufferRenderingParams.RenderHeight)</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span>                        {</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span>                            await Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =&gt;</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span>                            {</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span>                                SkiaBitmap tempBufferReference = BackBuffer;</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span> </div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span>                                _ = Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =&gt;</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span>                                {</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span>                                    tempBufferReference?.Dispose();</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span>                                }, Avalonia.Threading.DispatcherPriority.Send);</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span> </div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span>                                BackBuffer = <span class="keyword">new</span> SkiaBitmap(requestParams.RenderWidth, requestParams.RenderHeight);</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span>                                BackBufferSkiaCanvas = BackBuffer.SKCanvas;</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span>                            }, Avalonia.Threading.DispatcherPriority.MaxValue);</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span>                        }</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span> </div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span>                        canvas = BackBufferSkiaCanvas;</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span> </div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span>                        canvas.Save();</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span> </div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span>                        canvas.Scale(requestParams.Scale);</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno">  651</span>                        canvas.Translate(-requestParams.Left, -requestParams.Top);</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span> </div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span>                        canvas.Clear(BackgroundColour);</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span> </div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span>                        canvas.ClipRect(<span class="keyword">new</span> SKRect(requestParams.Left, requestParams.Top, requestParams.Left + requestParams.Width, requestParams.Top + requestParams.Height));</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span> </div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span>                        RenderImage(canvas);</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span> </div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span>                        canvas.RestoreToCount(-1);</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span> </div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span>                        BackBufferRenderingParams = requestParams;</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span> </div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span>                        lock (FrontBufferLock)</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span>                        {</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span>                            SkiaBitmap tempFrontReference = FrontBuffer;</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span>                            RenderingParameters tempFrontRenderingParameters = FrontBufferRenderingParams;</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span>                            SKCanvas tempFrontCanvas = FrontBufferSkiaCanvas;</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span> </div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span>                            FrontBuffer = BackBuffer;</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span>                            FrontBufferRenderingParams = BackBufferRenderingParams;</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span>                            FrontBufferSkiaCanvas = BackBufferSkiaCanvas;</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span> </div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span>                            BackBuffer = BackBuffer2;</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span>                            BackBufferRenderingParams = BackBufferRenderingParams2;</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span>                            BackBufferSkiaCanvas = BackBufferSkiaCanvas2;</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span> </div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span>                            BackBuffer2 = tempFrontReference;</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno">  678</span>                            BackBufferRenderingParams2 = tempFrontRenderingParameters;</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span>                            BackBufferSkiaCanvas2 = tempFrontCanvas;</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span>                        }</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span> </div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span>                        await Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =&gt;</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span>                        {</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span>                            base.InvalidateVisual();</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span>                        }, Avalonia.Threading.DispatcherPriority.MaxValue);</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno">  686</span>                    }</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span>                }</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span>            });</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span> </div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span>            renderingThread.Start();</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span>        }</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span><span class="comment"></span> </div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span><span class="comment">        /// A lock for the rendering loop. The public methods of this class already lock on this, but you may need it if you want to directly manipulate the contents of the canvas.</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">  696</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">object</span> <a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a> = <span class="keyword">new</span> object();</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span><span class="comment"></span> </div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span><span class="comment">        /// Render the image to a bitmap at the specified resolution.</span></div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span><span class="comment">        /// &lt;param name=&quot;width&quot;&gt;The width of the rendered image. Note that the actual width of the returned image might be lower than this, depending on the aspect ratio of the image.&lt;/param&gt;</span></div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span><span class="comment">        /// &lt;param name=&quot;height&quot;&gt;The height of the rendered image. Note that the actual height of the returned image might be lower than this, depending on the aspect ratio of the image.&lt;/param&gt;</span></div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span><span class="comment">        /// &lt;param name=&quot;background&quot;&gt;The background colour for the image. If this is &lt;see langword=&quot;null&quot; /&gt;, the current background colour is used.&lt;/param&gt;</span></div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span><span class="comment">        /// &lt;returns&gt;A &lt;see cref=&quot;RenderTargetBitmap&quot;/&gt; containing the image rendered at the specified resolution.&lt;/returns&gt;</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4ca16a4f659a0fd5411c3d713aab4b4d">  705</a></span><span class="comment"></span>        <span class="keyword">public</span> RenderTargetBitmap <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4ca16a4f659a0fd5411c3d713aab4b4d">RenderAtResolution</a>(<span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height, SKColor? background = <span class="keyword">null</span>)</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span>        {</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span>            SKColor realBackground = background ?? this.BackgroundColour;</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span> </div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span>            <span class="keywordtype">double</span> scale = Math.Min(width / this.<a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4fd73dc712c4f90ed8e00412eb50bdd2">PageWidth</a>, height / this.<a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aabe2d24ee767ba8e7bac57f98d88a0ef">PageHeight</a>);</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno">  710</span> </div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span>            width = (int)Math.Round(<span class="keyword">this</span>.PageWidth * scale);</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span>            height = (int)Math.Round(<span class="keyword">this</span>.PageHeight * scale);</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span> </div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span>            SkiaBitmap skBmp = <span class="keyword">new</span> SkiaBitmap(width, height);</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span>            SKCanvas canvas = skBmp.SKCanvas;</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span> </div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span>            canvas.Clear(realBackground);</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span> </div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span>            canvas.Save();</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span> </div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span>            canvas.Scale((<span class="keywordtype">float</span>)scale);</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span> </div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span>            RenderImage(canvas);</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span> </div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span>            canvas.RestoreToCount(-1);</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span> </div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span>            skBmp.Indispose();</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span> </div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span>            <span class="keywordflow">return</span> skBmp.AvaloniaBitmap;</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span>        }</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span> </div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> RenderImage(SKCanvas canvas)</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span>        {</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span>            lock (<a class="code hl_variable" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">RenderLock</a>)</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span>            {</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; this.RenderActions.Count; i++)</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span>                {</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span>                    canvas.Save();</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span> </div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span>                    <span class="keywordflow">if</span> (this.LayerTransforms[i].ActionType == <a class="code hl_class" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">SKRenderAction</a>.<a class="code hl_enumeration" href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html#afeb0838c89e91c66e8e6a35c846be3b4">ActionTypes</a>.Transform)</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span>                    {</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span>                        SKMatrix mat = this.LayerTransforms[i].Transform.Value;</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span>                        canvas.Concat(ref mat);</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span>                    }</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno">  745</span> </div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span>                    RenderLayer(canvas, i);</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span>                    canvas.Restore();</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span>                }</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span>            }</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span>        }</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span> </div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span>        <span class="keyword">private</span> <span class="keywordtype">void</span> RenderLayer(SKCanvas canvas, <span class="keywordtype">int</span> layer)</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span>        {</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno">  754</span>            <span class="keywordtype">bool</span> updateHitTests = this.TaggedRenderActions[this.TaggedRenderActions.Count - 1 - layer].Count &gt; 0;</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span> </div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span>            HashSet&lt;uint&gt; ZIndices = <span class="keyword">new</span> HashSet&lt;uint&gt;();</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span> </div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span>            canvas.Save();</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span> </div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span>            SKMatrix invertedInitialTransform;</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span> </div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span>            <span class="keywordflow">if</span> (this.LayerTransforms[layer].ActionType == SKRenderAction.ActionTypes.Transform)</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span>            {</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span>                invertedInitialTransform = (canvas.TotalMatrix.PreConcat(this.LayerTransforms[layer].Transform.Value.Invert())).Invert();</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span>            }</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span>            <span class="keywordflow">else</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span>            {</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span>                invertedInitialTransform = canvas.TotalMatrix.Invert();</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span>            }</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span> </div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span>            SKPath clipPath = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span>            Stack&lt;SKPath&gt; clipPaths = <span class="keyword">new</span> Stack&lt;SKPath&gt;();</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span>            clipPaths.Push(<span class="keyword">null</span>);</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span> </div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span>            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; this.RenderActions[layer].Count; i++)</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span>            {</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span>                ZIndices.Add(this.RenderActions[layer][i].ZIndex);</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span> </div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span>                <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Clip)</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span>                {</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span>                    canvas.ClipPath(this.RenderActions[layer][i].Path, antialias: <span class="keyword">true</span>);</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span> </div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span>                    <span class="keywordflow">if</span> (updateHitTests)</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span>                    {</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span>                        <span class="keywordflow">if</span> (clipPath == <span class="keyword">null</span>)</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span>                        {</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span>                            clipPath = this.RenderActions[layer][i].Path.Clone();</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span>                            clipPath.Transform(canvas.TotalMatrix.PostConcat(invertedInitialTransform));</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span>                        }</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span>                        <span class="keywordflow">else</span></div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span>                        {</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno">  792</span>                            <span class="keyword">using</span> (SKPath tempPath = this.RenderActions[layer][i].Path.Clone())</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span>                            {</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno">  794</span>                                tempPath.Transform(canvas.TotalMatrix.PostConcat(invertedInitialTransform));</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span>                                clipPath.Op(tempPath, SKPathOp.Intersect);</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span>                            }</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span>                        }</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span>                    }</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span>                }</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span>                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Restore)</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno">  801</span>                {</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span>                    canvas.Restore();</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span> </div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span>                    <span class="keywordflow">if</span> (updateHitTests)</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span>                    {</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span>                        clipPath = clipPaths.Pop();</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span>                    }</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span>                }</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span>                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Save)</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span>                {</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span>                    canvas.Save();</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span> </div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno">  813</span>                    <span class="keywordflow">if</span> (updateHitTests)</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno">  814</span>                    {</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno">  815</span>                        clipPaths.Push(clipPath?.Clone());</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span>                    }</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span>                }</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span>                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Transform)</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span>                {</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span>                    SKMatrix mat = this.RenderActions[layer][i].Transform.Value;</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno">  821</span>                    canvas.Concat(ref mat);</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno">  822</span>                }</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno">  823</span>                <span class="keywordflow">else</span></div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span>                {</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno">  825</span>                    <span class="keywordflow">if</span> (this.RenderActions[layer][i].ZIndex == 0)</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span>                    {</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno">  827</span> </div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno">  828</span>                        <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Path &amp;&amp; <span class="keyword">this</span>.RenderActions[layer][i].Path != <span class="keyword">null</span>)</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span>                        {</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span>                            canvas.DrawPath(this.RenderActions[layer][i].Path, this.RenderActions[layer][i].Paint);</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno">  831</span>                        }</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Text)</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span>                        {</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno">  834</span>                            canvas.DrawText(this.RenderActions[layer][i].Text, this.RenderActions[layer][i].TextX, this.RenderActions[layer][i].TextY, this.RenderActions[layer][i].Font, this.RenderActions[layer][i].Paint);</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno">  835</span>                        }</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno">  836</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.RasterImage)</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span>                        {</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span>                            (SKBitmap image, <span class="keywordtype">bool</span> interpolate) = this.Images[this.RenderActions[layer][i].ImageId];</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span> </div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno">  840</span>                            SKPaint paint;</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno">  841</span> </div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno">  842</span>                            <span class="keywordflow">if</span> (!interpolate)</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span>                            {</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno">  844</span>                                paint = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno">  845</span>                            }</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span>                            <span class="keywordflow">else</span></div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span>                            {</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span>                                paint = <span class="keyword">new</span> SKPaint() { FilterQuality = SKFilterQuality.Medium };</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno">  849</span>                            }</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span> </div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno">  851</span>                            canvas.DrawBitmap(image, this.RenderActions[layer][i].ImageSource.Value, <span class="keyword">this</span>.RenderActions[layer][i].ImageDestination.Value, paint);</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno">  852</span> </div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span>                            paint?.Dispose();</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span>                        }</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno">  855</span>                    }</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span> </div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span>                    <span class="keywordflow">if</span> (updateHitTests &amp;&amp; this.RenderActions[layer][i].Tag != <span class="keyword">null</span> &amp;&amp; this.RenderActions[layer][i].HitTestPath != <span class="keyword">null</span>)</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno">  858</span>                    {</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span>                        SKPath hitTestPath = this.RenderActions[layer][i].HitTestPath.Clone();</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span>                        hitTestPath.Transform(canvas.TotalMatrix.PostConcat(invertedInitialTransform));</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno">  861</span> </div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span>                        <span class="keywordflow">if</span> (clipPath != <span class="keyword">null</span>)</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span>                        {</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span>                            hitTestPath.Op(clipPath, SKPathOp.Intersect);</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span>                        }</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno">  866</span> </div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno">  867</span>                        this.RenderActions[layer][i].LastRenderedGlobalHitTestPath = hitTestPath;</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span>                    }</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span>                }</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span>            }</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span> </div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span>            canvas.Restore();</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span> </div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno">  874</span>            uint[] sortedIndices = ZIndices.OrderBy(x =&gt; x).ToArray();</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span> </div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span>            <span class="keywordflow">if</span> (sortedIndices.Length &gt; 1 || sortedIndices[0] != 0)</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span>            {</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno">  878</span>                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; sortedIndices.Length; j++)</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno">  879</span>                {</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span>                    canvas.Save();</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span> </div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno">  882</span>                    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; this.RenderActions[layer].Count; i++)</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span>                    {</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span>                        <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Clip)</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno">  885</span>                        {</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno">  886</span>                            canvas.ClipPath(this.RenderActions[layer][i].Path, antialias: <span class="keyword">true</span>);</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno">  887</span>                        }</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Restore)</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span>                        {</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno">  890</span>                            canvas.Restore();</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno">  891</span>                        }</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno">  892</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Save)</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno">  893</span>                        {</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span>                            canvas.Save();</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span>                        }</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Transform)</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno">  897</span>                        {</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno">  898</span>                            SKMatrix mat = this.RenderActions[layer][i].Transform.Value;</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span>                            canvas.Concat(ref mat);</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno">  900</span>                        }</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno">  901</span>                        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sortedIndices[j] != 0 &amp;&amp; this.RenderActions[layer][i].ZIndex == sortedIndices[j])</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno">  902</span>                        {</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno">  903</span>                            <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Path &amp;&amp; <span class="keyword">this</span>.RenderActions[layer][i].Path != <span class="keyword">null</span>)</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno">  904</span>                            {</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno">  905</span>                                canvas.DrawPath(this.RenderActions[layer][i].Path, this.RenderActions[layer][i].Paint);</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno">  906</span>                            }</div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno">  907</span>                            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.Text)</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno">  908</span>                            {</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno">  909</span>                                canvas.DrawText(this.RenderActions[layer][i].Text, this.RenderActions[layer][i].TextX, this.RenderActions[layer][i].TextY, this.RenderActions[layer][i].Font, this.RenderActions[layer][i].Paint);</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno">  910</span>                            }</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno">  911</span>                            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (this.RenderActions[layer][i].ActionType == SKRenderAction.ActionTypes.RasterImage)</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno">  912</span>                            {</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno">  913</span>                                (SKBitmap image, <span class="keywordtype">bool</span> interpolate) = this.Images[this.RenderActions[layer][i].ImageId];</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno">  914</span> </div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno">  915</span>                                SKPaint paint;</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno">  916</span> </div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno">  917</span>                                <span class="keywordflow">if</span> (!interpolate)</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno">  918</span>                                {</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno">  919</span>                                    paint = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno">  920</span>                                }</div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno">  921</span>                                <span class="keywordflow">else</span></div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno">  922</span>                                {</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno">  923</span>                                    paint = <span class="keyword">new</span> SKPaint() { FilterQuality = SKFilterQuality.Medium };</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno">  924</span>                                }</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno">  925</span> </div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno">  926</span>                                canvas.DrawBitmap(image, this.RenderActions[layer][i].ImageSource.Value, <span class="keyword">this</span>.RenderActions[layer][i].ImageDestination.Value, paint);</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno">  927</span> </div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno">  928</span>                                paint?.Dispose();</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno">  929</span>                            }</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno">  930</span>                        }</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno">  931</span>                    }</div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno">  932</span> </div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno">  933</span>                    canvas.Restore();</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno">  934</span>                }</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno">  935</span>            }</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno">  936</span>        }</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno">  937</span> </div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno">  938</span>        <span class="keyword">private</span> <span class="keywordtype">bool</span> IsDirty = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno">  939</span><span class="comment"></span> </div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno">  940</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno">  941</span><span class="comment">        /// Invalidate the contents of the canvas, forcing it to redraw itself.</span></div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno">  942</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">  943</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>()</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno">  944</span>        {</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno">  945</span>            this.IsDirty = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno">  946</span>            base.InvalidateVisual();</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno">  947</span>        }</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno">  948</span><span class="comment"></span> </div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno">  949</span><span class="comment">        /// &lt;summary&gt;</span></div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno">  950</span><span class="comment">        /// Invalidate the contents of the canvas, specifying that the order of the layers has changed.</span></div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno">  951</span><span class="comment">        /// &lt;/summary&gt;</span></div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a28e9f0cfe4fa1286ac9b90b8ae33b2d2">  952</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a28e9f0cfe4fa1286ac9b90b8ae33b2d2">InvalidateZIndex</a>()</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno">  953</span>        {</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno">  954</span>            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; this.TaggedRenderActions.Count; i++)</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno">  955</span>            {</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno">  956</span>                this.TaggedRenderActions[i] = this.TaggedRenderActions[i].OrderByDescending(a =&gt; a.ZIndex).ToList();</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno">  957</span>            }</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno">  958</span>            this.<a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">InvalidateDirty</a>();</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno">  959</span>        }</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno">  960</span> </div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno">  961</span> </div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno">  962</span>        <span class="keyword">private</span> SkiaBitmap FrontBuffer = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno">  963</span>        <span class="keyword">private</span> RenderingParameters FrontBufferRenderingParams = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno">  964</span>        <span class="keyword">private</span> readonly <span class="keywordtype">object</span> EmptyFrontBufferLock = <span class="keyword">new</span> object();</div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno">  965</span>        <span class="keyword">private</span> <span class="keywordtype">object</span> FrontBufferLock =&gt; FrontBuffer?.Lock ?? EmptyFrontBufferLock;</div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno">  966</span>        SKCanvas FrontBufferSkiaCanvas = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno">  967</span> </div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno">  968</span>        <span class="keyword">private</span> SkiaBitmap BackBuffer = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno">  969</span>        <span class="keyword">private</span> RenderingParameters BackBufferRenderingParams = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno">  970</span>        SKCanvas BackBufferSkiaCanvas = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno">  971</span> </div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno">  972</span>        <span class="keyword">private</span> SkiaBitmap BackBuffer2 = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno">  973</span>        <span class="keyword">private</span> RenderingParameters BackBufferRenderingParams2 = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno">  974</span>        SKCanvas BackBufferSkiaCanvas2 = <span class="keyword">null</span>;</div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno">  975</span><span class="comment"></span> </div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno">  976</span><span class="comment">        /// &lt;inheritdoc/&gt;</span></div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a6bc35a6235e3f24da0d2c27d5868c587">  977</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a6bc35a6235e3f24da0d2c27d5868c587">Render</a>(DrawingContext context)</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno">  978</span>        {</div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno">  979</span>            lock (FrontBufferLock)</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno">  980</span>            {</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno">  981</span>                <span class="keywordtype">double</span> scale;</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno">  982</span> </div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno">  983</span>                PixelPoint layoutTopLeft = this.PointToScreen(<span class="keyword">new</span> Avalonia.Point(0, 0));</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno">  984</span>                PixelPoint layoutBottomRight = this.PointToScreen(<span class="keyword">new</span> Avalonia.Point(<span class="keyword">this</span>.Bounds.Width, <span class="keyword">this</span>.Bounds.Height));</div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno">  985</span> </div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno">  986</span>                scale = 0.5 * (this.PageWidth / (layoutBottomRight.X - layoutTopLeft.X) + this.<a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aabe2d24ee767ba8e7bac57f98d88a0ef">PageHeight</a> / (layoutBottomRight.Y - layoutTopLeft.Y));</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno">  987</span> </div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno">  988</span>                Avalonia.Controls.Control parent = this.Parent as Avalonia.Controls.Control;</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno">  989</span> </div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno">  990</span>                <span class="keywordtype">double</span> left;</div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno">  991</span>                <span class="keywordtype">double</span> top;</div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno">  992</span>                <span class="keywordtype">double</span> width;</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno">  993</span>                <span class="keywordtype">double</span> height;</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno">  994</span> </div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno">  995</span>                <span class="keywordflow">if</span> (this.ClipToBounds &amp;&amp; parent != <span class="keyword">null</span>)</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno">  996</span>                {</div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno">  997</span>                    Avalonia.Point clipTopLeft = this.PointToClient(parent.PointToScreen(<span class="keyword">new</span> Avalonia.Point(0, 0)));</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno">  998</span>                    Avalonia.Point clipBottomRight = this.PointToClient(parent.PointToScreen(<span class="keyword">new</span> Avalonia.Point(parent.Bounds.Width, parent.Bounds.Height)));</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno">  999</span> </div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span>                    Rect clipBounds;</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> </div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span>                    <span class="keywordflow">if</span> (<a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Unit == RelativeUnit.Absolute)</div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span>                    {</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span>                        clipBounds = <span class="keyword">new</span> Rect(clipTopLeft.X - <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.X, clipTopLeft.Y - <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.Y, clipBottomRight.X - clipTopLeft.X + <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.X * 2, clipBottomRight.Y - clipTopLeft.Y + <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.Y * 2);</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span>                    }</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span>                    <span class="keywordflow">else</span></div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span>                    {</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span>                        <span class="keywordtype">double</span> clipW = clipBottomRight.X - clipTopLeft.X;</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span>                        <span class="keywordtype">double</span> clipH = clipBottomRight.Y - clipTopLeft.Y;</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> </div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span>                        clipBounds = <span class="keyword">new</span> Rect(clipTopLeft.X - clipW * <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.X, clipTopLeft.Y - clipH * <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.Y, clipW * (1 + 2 * <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.X), clipH * (1 + 2 * <a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">ClipMargin</a>.Point.Y));</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span>                    }</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> </div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span>                    left = Math.Max(0, clipBounds.Left);</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span>                    top = Math.Max(0, clipBounds.Top);</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> </div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span>                    width = Math.Min(clipBounds.Width, <span class="keyword">this</span>.PageWidth);</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span>                    height = Math.Min(clipBounds.Height, <span class="keyword">this</span>.PageHeight);</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span>                }</div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span>                <span class="keywordflow">else</span></div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span>                {</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span>                    left = 0;</div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span>                    top = 0;</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> </div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span>                    width = this.<a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4fd73dc712c4f90ed8e00412eb50bdd2">PageWidth</a>;</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span>                    height = this.<a class="code hl_property" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aabe2d24ee767ba8e7bac57f98d88a0ef">PageHeight</a>;</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span>                }</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> </div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span>                <span class="keywordtype">int</span> pixelWidth = (int)Math.Round(width / scale);</div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span>                <span class="keywordtype">int</span> pixelHeight = (int)Math.Round(height / scale);</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> </div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span>                <span class="keywordflow">if</span> (pixelWidth &gt; 0 &amp;&amp; pixelHeight &gt; 0)</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span>                {</div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span>                    <span class="keywordflow">if</span> (!this.ClipToBounds &amp;&amp; (pixelWidth * pixelHeight &gt;= <span class="keywordtype">int</span>.MaxValue / 8 || pixelWidth * pixelHeight &lt; 0))</div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span>                    {</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span>                        <span class="keywordtype">double</span> ratio = width / height;</div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> </div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span>                        pixelHeight = (int)Math.Round(Math.Sqrt(<span class="keywordtype">int</span>.MaxValue / (8 * ratio)));</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span>                        pixelWidth = (int)Math.Round(pixelHeight * ratio);</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span>                    }</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> </div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span>                    PixelPoint topLeftScreen = this.PointToScreen(<span class="keyword">new</span> Avalonia.Point(left, top));</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span>                    Avalonia.Point topLeft = this.PointToClient(topLeftScreen);</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span>                    Avalonia.Point bottomRight = this.PointToClient(<span class="keyword">new</span> PixelPoint(topLeftScreen.X + pixelWidth, topLeftScreen.Y + pixelHeight));</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> </div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span>                    Rect targetRect = <span class="keyword">new</span> Rect(topLeft, bottomRight);</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span>                    </div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span>                    pixelWidth = this.PointToScreen(targetRect.BottomRight).X - this.PointToScreen(targetRect.TopLeft).X;</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span>                    pixelHeight = this.PointToScreen(targetRect.BottomRight).Y - this.PointToScreen(targetRect.TopLeft).Y;</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> </div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span>                    RenderingParameters currentParameters = <span class="keyword">new</span> RenderingParameters((<span class="keywordtype">float</span>)left, (<span class="keywordtype">float</span>)top, (<span class="keywordtype">float</span>)width, (<span class="keywordtype">float</span>)height, (<span class="keywordtype">float</span>)(1 / scale), pixelWidth, pixelHeight);</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> </div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span>                    <span class="keywordflow">if</span> (FrontBuffer != <span class="keyword">null</span> &amp;&amp; FrontBufferRenderingParams == currentParameters &amp;&amp; !IsDirty)</div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span>                    {</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span>                        <span class="keywordflow">if</span> (RenderRequestedHandle.WaitOne(0))</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span>                        {</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span>                            Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =&gt;</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span>                            {</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span>                                this.InvalidateVisual();</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span>                            });</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span>                        }</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> </div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span>                        context.DrawImage(FrontBuffer, <span class="keyword">new</span> Rect(0, 0, pixelWidth, pixelHeight), targetRect);</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span>                    }</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span>                    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (FrontBuffer != <span class="keyword">null</span> &amp;&amp; FrontBufferRenderingParams.GoodEnough(currentParameters) &amp;&amp; !IsDirty)</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span>                    {</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span>                        <span class="keywordflow">if</span> (RenderRequestedHandle.WaitOne(0))</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span>                        {</div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span>                            Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =&gt;</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span>                            {</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span>                                this.InvalidateVisual();</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span>                            });</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span>                        }</div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span>                        context.DrawImage(FrontBuffer, <span class="keyword">new</span> Rect(0, 0, FrontBufferRenderingParams.RenderWidth, FrontBufferRenderingParams.RenderHeight), <span class="keyword">new</span> Rect(FrontBufferRenderingParams.Left, FrontBufferRenderingParams.Top, FrontBufferRenderingParams.Width, FrontBufferRenderingParams.Height));</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span>                    }</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span>                    <span class="keywordflow">else</span></div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span>                    {</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span>                        lock (RenderingRequestLock)</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span>                        {</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span>                            IsDirty = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span>                            RenderingRequest = currentParameters;</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span>                            RenderRequestedHandle.Set();</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span>                        }</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> </div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span>                        <span class="keywordflow">if</span> (FrontBuffer != <span class="keyword">null</span>)</div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span>                        {</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span>                            context.DrawImage(FrontBuffer, <span class="keyword">new</span> Rect(0, 0, FrontBufferRenderingParams.RenderWidth, FrontBufferRenderingParams.RenderHeight), <span class="keyword">new</span> Rect(FrontBufferRenderingParams.Left, FrontBufferRenderingParams.Top, FrontBufferRenderingParams.Width, FrontBufferRenderingParams.Height));</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span>                        }</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> </div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span>                        Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =&gt;</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span>                        {</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span>                            this.InvalidateVisual();</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span>                        });</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span>                    }</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span>                }</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span>            }</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span>        }</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> </div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span>        <span class="keyword">private</span> <span class="keywordtype">bool</span> disposedValue;</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span><span class="comment"></span> </div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span><span class="comment">        /// &lt;inheritdoc cref=&quot;Dispose()&quot;/&gt;</span></div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span><span class="comment"></span>        <span class="keyword">protected</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ab28d9c9dc4156695119b583fcffcc3da">Dispose</a>(<span class="keywordtype">bool</span> disposing)</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span>        {</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span>            <span class="keywordflow">if</span> (!disposedValue)</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span>            {</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span>                <span class="keywordflow">if</span> (disposing)</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span>                {</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span>                    this.BackBuffer?.Dispose();</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span>                    this.BackBuffer2?.Dispose();</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span>                    this.DisposedHandle?.Set();</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span>                    this.FrontBuffer?.Dispose();</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> </div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span>                    <span class="keywordflow">foreach</span> (KeyValuePair&lt;<span class="keywordtype">string</span>, (SKBitmap, <span class="keywordtype">bool</span>)&gt; image in this.Images)</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span>                    {</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span>                        image.Value.Item1?.Dispose();</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span>                    }</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> </div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span>                    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; this.RenderActions?.Count; i++)</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span>                    {</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span>                        <span class="keywordflow">foreach</span> (SKRenderAction act <span class="keywordflow">in</span> this.RenderActions[i])</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span>                        {</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span>                            act?.Dispose();</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span>                        }</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> </div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span>                        this.LayerTransforms?[i]?.Dispose();</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span>                    }</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span>                }</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> </div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span>                disposedValue = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span>            }</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span>        }</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span><span class="comment"></span> </div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span><span class="comment">        /// &lt;inheritdoc/&gt;</span></div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"><a class="line" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ab28d9c9dc4156695119b583fcffcc3da"> 1134</a></span><span class="comment"></span>        <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ab28d9c9dc4156695119b583fcffcc3da">Dispose</a>()</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span>        {</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span>            <a class="code hl_function" href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ab28d9c9dc4156695119b583fcffcc3da">Dispose</a>(disposing: <span class="keyword">true</span>);</div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span>            GC.SuppressFinalize(<span class="keyword">this</span>);</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span>        }</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span>    }</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span>}</div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html">VectSharp.Canvas.SKMultiLayerRenderCanvas</a></div><div class="ttdoc">Represents a multi-threaded, triple-buffered canvas on which the image is drawn using SkiaSharp.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00039">SKMultiLayerRenderCanvas.cs:40</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a00243775be8cd6bb94efc35791b26c71"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a00243775be8cd6bb94efc35791b26c71">VectSharp.Canvas.SKMultiLayerRenderCanvas.SKMultiLayerRenderCanvas</a></div><div class="ttdeci">SKMultiLayerRenderCanvas(Document document, Colour backgroundColour, double width, double height, List&lt; SKRenderAction &gt; layerTransforms=null)</div><div class="ttdoc">Create a new SKMultiLayerRenderCanvas from a Document, where each page represents a layer.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00082">SKMultiLayerRenderCanvas.cs:82</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a1701ed51368b6dc5bb771b5ea858e4ee"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a1701ed51368b6dc5bb771b5ea858e4ee">VectSharp.Canvas.SKMultiLayerRenderCanvas.InvalidateDirty</a></div><div class="ttdeci">void InvalidateDirty()</div><div class="ttdoc">Invalidate the contents of the canvas, forcing it to redraw itself.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00943">SKMultiLayerRenderCanvas.cs:943</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a28e9f0cfe4fa1286ac9b90b8ae33b2d2"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a28e9f0cfe4fa1286ac9b90b8ae33b2d2">VectSharp.Canvas.SKMultiLayerRenderCanvas.InvalidateZIndex</a></div><div class="ttdeci">void InvalidateZIndex()</div><div class="ttdoc">Invalidate the contents of the canvas, specifying that the order of the layers has changed.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00952">SKMultiLayerRenderCanvas.cs:952</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a2afc05715ff7c9e4cb273943d70939ed"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a2afc05715ff7c9e4cb273943d70939ed">VectSharp.Canvas.SKMultiLayerRenderCanvas.UpdateLayer</a></div><div class="ttdeci">void UpdateLayer(int layer, SKRenderContext newContent, SKRenderAction newTransform)</div><div class="ttdoc">Replace a single layer with the specified content.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00224">SKMultiLayerRenderCanvas.cs:224</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a474ef13fd5ff3c54f679836ffd45af95"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a474ef13fd5ff3c54f679836ffd45af95">VectSharp.Canvas.SKMultiLayerRenderCanvas.RemoveLayer</a></div><div class="ttdeci">void RemoveLayer(int layer)</div><div class="ttdoc">Remove the specified layer from the image.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00320">SKMultiLayerRenderCanvas.cs:320</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a477d90bbd72a0656f8b05cb436ef2e91"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a477d90bbd72a0656f8b05cb436ef2e91">VectSharp.Canvas.SKMultiLayerRenderCanvas.ClipMargin</a></div><div class="ttdeci">RelativePoint ClipMargin</div><div class="ttdoc">Defines an overdraw margin for the clipping area. Set this to a larger value if quickly moving the ca...</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00059">SKMultiLayerRenderCanvas.cs:59</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a4ca16a4f659a0fd5411c3d713aab4b4d"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4ca16a4f659a0fd5411c3d713aab4b4d">VectSharp.Canvas.SKMultiLayerRenderCanvas.RenderAtResolution</a></div><div class="ttdeci">RenderTargetBitmap RenderAtResolution(int width, int height, SKColor? background=null)</div><div class="ttdoc">Render the image to a bitmap at the specified resolution.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00705">SKMultiLayerRenderCanvas.cs:705</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a4fd73dc712c4f90ed8e00412eb50bdd2"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a4fd73dc712c4f90ed8e00412eb50bdd2">VectSharp.Canvas.SKMultiLayerRenderCanvas.PageWidth</a></div><div class="ttdeci">double PageWidth</div><div class="ttdoc">The width of the page that is rendered on this canvas.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00044">SKMultiLayerRenderCanvas.cs:44</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a65033e30e6cb9cf268c71f7a9949770e"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a65033e30e6cb9cf268c71f7a9949770e">VectSharp.Canvas.SKMultiLayerRenderCanvas.MoveLayer</a></div><div class="ttdeci">void MoveLayer(int oldIndex, int newIndex)</div><div class="ttdoc">Move the specified layer to the specified position, shifting all other layers as necessary.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00369">SKMultiLayerRenderCanvas.cs:369</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a6aaf18105ecb0af2b80c52f576d224d9"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a6aaf18105ecb0af2b80c52f576d224d9">VectSharp.Canvas.SKMultiLayerRenderCanvas.InsertLayer</a></div><div class="ttdeci">void InsertLayer(int index, SKRenderContext newContent, SKRenderAction newTransform)</div><div class="ttdoc">Insert a new layer at the specified index.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00289">SKMultiLayerRenderCanvas.cs:289</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a6bc35a6235e3f24da0d2c27d5868c587"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a6bc35a6235e3f24da0d2c27d5868c587">VectSharp.Canvas.SKMultiLayerRenderCanvas.Render</a></div><div class="ttdeci">override void Render(DrawingContext context)</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00977">SKMultiLayerRenderCanvas.cs:977</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a777e28bd741c4a2f18f223f7cc628bbf"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a777e28bd741c4a2f18f223f7cc628bbf">VectSharp.Canvas.SKMultiLayerRenderCanvas.SKMultiLayerRenderCanvas</a></div><div class="ttdeci">SKMultiLayerRenderCanvas(List&lt; SKRenderContext &gt; contents, List&lt; SKRenderAction &gt; contentTransforms, Colour backgroundColour, double width, double height)</div><div class="ttdoc">Create a new SKMultiLayerRenderCanvas from a list of SKRenderContexts, each representing a layer.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00125">SKMultiLayerRenderCanvas.cs:125</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a7ff6c67552e1715308850a5bba174941"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a7ff6c67552e1715308850a5bba174941">VectSharp.Canvas.SKMultiLayerRenderCanvas.RenderLock</a></div><div class="ttdeci">object RenderLock</div><div class="ttdoc">A lock for the rendering loop. The public methods of this class already lock on this,...</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00696">SKMultiLayerRenderCanvas.cs:696</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a84c5f8dc4c4351723414e55fa01eafe7"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a84c5f8dc4c4351723414e55fa01eafe7">VectSharp.Canvas.SKMultiLayerRenderCanvas.UpdateWith</a></div><div class="ttdeci">void UpdateWith(List&lt; SKRenderContext &gt; contents, List&lt; SKRenderAction &gt; contentTransforms, Colour backgroundColour, double width, double height)</div><div class="ttdoc">Replace the contents of the SKMultiLayerRenderCanvas with the specified layers.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00146">SKMultiLayerRenderCanvas.cs:146</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a8bc4e8c89dcb02f5beaa0a18c4c94bb5"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a8bc4e8c89dcb02f5beaa0a18c4c94bb5">VectSharp.Canvas.SKMultiLayerRenderCanvas.AddLayer</a></div><div class="ttdeci">void AddLayer(SKRenderContext newContent, SKRenderAction newTransform)</div><div class="ttdoc">Add a new layer to the image.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00256">SKMultiLayerRenderCanvas.cs:256</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_a9a5fb8009c0eacdcfea4667f2dd21f1e"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#a9a5fb8009c0eacdcfea4667f2dd21f1e">VectSharp.Canvas.SKMultiLayerRenderCanvas.SKMultiLayerRenderCanvas</a></div><div class="ttdeci">SKMultiLayerRenderCanvas(IEnumerable&lt; Page &gt; layers, Colour backgroundColour, double width, double height, List&lt; SKRenderAction &gt; layerTransforms=null)</div><div class="ttdoc">Create a new SKMultiLayerRenderCanvas from a collection of Pages, each representing a layer.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00092">SKMultiLayerRenderCanvas.cs:92</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_aa8cabc258828463f73b9d90612d9abee"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aa8cabc258828463f73b9d90612d9abee">VectSharp.Canvas.SKMultiLayerRenderCanvas.LayerTransforms</a></div><div class="ttdeci">List&lt; SKRenderAction &gt; LayerTransforms</div><div class="ttdoc">The list of transforms associated with each layer.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00069">SKMultiLayerRenderCanvas.cs:69</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_aab220bda90e3a0c36f27b87bfbeff6f0"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aab220bda90e3a0c36f27b87bfbeff6f0">VectSharp.Canvas.SKMultiLayerRenderCanvas.RenderActions</a></div><div class="ttdeci">List&lt; List&lt; SKRenderAction &gt; &gt; RenderActions</div><div class="ttdoc">The list of render actions. Each element in this list is itself a list, containing the actions that c...</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00064">SKMultiLayerRenderCanvas.cs:64</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_aabe2d24ee767ba8e7bac57f98d88a0ef"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#aabe2d24ee767ba8e7bac57f98d88a0ef">VectSharp.Canvas.SKMultiLayerRenderCanvas.PageHeight</a></div><div class="ttdeci">double PageHeight</div><div class="ttdoc">The height of the page that is rendered on this canvas.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00049">SKMultiLayerRenderCanvas.cs:49</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_ab28d9c9dc4156695119b583fcffcc3da"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ab28d9c9dc4156695119b583fcffcc3da">VectSharp.Canvas.SKMultiLayerRenderCanvas.Dispose</a></div><div class="ttdeci">void Dispose()</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l01134">SKMultiLayerRenderCanvas.cs:1134</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas_html_ad13a708bdb0b9a7d533f78b8eb931260"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_multi_layer_render_canvas.html#ad13a708bdb0b9a7d533f78b8eb931260">VectSharp.Canvas.SKMultiLayerRenderCanvas.SwitchLayers</a></div><div class="ttdeci">void SwitchLayers(int layer1, int layer2)</div><div class="ttdoc">Switch the position of the two specified layers.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_multi_layer_render_canvas_8cs_source.html#l00344">SKMultiLayerRenderCanvas.cs:344</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_render_action_html"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html">VectSharp.Canvas.SKRenderAction</a></div><div class="ttdoc">Represents a light-weight rendering action.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_render_context_8cs_source.html#l00030">SKRenderContext.cs:31</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_render_action_html_a81405205be792374ef65bdf89cab3a4c"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html#a81405205be792374ef65bdf89cab3a4c">VectSharp.Canvas.SKRenderAction.TransformAction</a></div><div class="ttdeci">static SKRenderAction TransformAction(SKMatrix transform, string tag=null)</div><div class="ttdoc">Creates a new SKRenderAction representing a transform.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_render_context_8cs_source.html#l00422">SKRenderContext.cs:422</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_render_action_html_aa88ade8626d0abce8ded370480430f4f"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html#aa88ade8626d0abce8ded370480430f4f">VectSharp.Canvas.SKRenderAction.Disposed</a></div><div class="ttdeci">bool Disposed</div><div class="ttdoc">Returns a boolean value indicating whether the current instance has been disposed.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_render_context_8cs_source.html#l00035">SKRenderContext.cs:35</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_render_action_html_afeb0838c89e91c66e8e6a35c846be3b4"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_render_action.html#afeb0838c89e91c66e8e6a35c846be3b4">VectSharp.Canvas.SKRenderAction.ActionTypes</a></div><div class="ttdeci">ActionTypes</div><div class="ttdoc">Types of rendering actions.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_render_context_8cs_source.html#l00042">SKRenderContext.cs:43</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_canvas_1_1_s_k_render_context_html"><div class="ttname"><a href="class_vect_sharp_1_1_canvas_1_1_s_k_render_context.html">VectSharp.Canvas.SKRenderContext</a></div><div class="ttdoc">Represents a page that has been prepared for fast rendering using the SkiaSharp renderer.</div><div class="ttdef"><b>Definition:</b> <a href="_s_k_render_context_8cs_source.html#l00546">SKRenderContext.cs:547</a></div></div>
<div class="ttc" id="aclass_vect_sharp_1_1_document_html"><div class="ttname"><a href="class_vect_sharp_1_1_document.html">VectSharp.Document</a></div><div class="ttdoc">Represents a collection of pages.</div><div class="ttdef"><b>Definition:</b> <a href="_document_8cs_source.html#l00027">Document.cs:28</a></div></div>
<div class="ttc" id="anamespace_vect_sharp_1_1_canvas_html"><div class="ttname"><a href="namespace_vect_sharp_1_1_canvas.html">VectSharp.Canvas</a></div><div class="ttdef"><b>Definition:</b> <a href="_animated_canvas_8cs_source.html#l00023">AnimatedCanvas.cs:24</a></div></div>
<div class="ttc" id="astruct_vect_sharp_1_1_colour_html"><div class="ttname"><a href="struct_vect_sharp_1_1_colour.html">VectSharp.Colour</a></div><div class="ttdoc">Represents an RGB colour.</div><div class="ttdef"><b>Definition:</b> <a href="_colour_8cs_source.html#l00028">Colour.cs:29</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_149613f3ae436a8a30c0225683d94748.html">VectSharp.Canvas</a></li><li class="navelem"><b>SKMultiLayerRenderCanvas.cs</b></li>
    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
  </ul>
</div>
</body>
</html>
